<?php
namespace App\Common\Cla\ClaBase\Traits;

use App\Common as com;

trait GoTimer {

	private array $_goTimerAsTimeout = [];

	/**
	 * 超时执行
	 * @param string $timerName 时间名字
	 * @param \Closure $fn
	 * @param int $timeoutTimeMs 超时时间。单位：ms（内部实现暂时只支持秒级）
	 * @param bool $firstCall 首页是否执行。[true][默认]
	 * @return com\Lib\Com\Returns\CallFnRes|false
	 */
	protected function goTimerAsTimeout( string $timerName, \Closure $fn, int $timeoutTimeMs, bool $firstCall = true ):com\Lib\Com\Returns\CallFnRes|false {
		// ...
		if( ! isset( $this->_goTimerAsTimeout[ $timerName ] ) ){
			// 初始化
			$this->_goTimerAsTimeout[ $timerName ] = [
				'lastTime' => 0,
			];
			if( ! $firstCall ){
				$this->_goTimerAsTimeout[ $timerName ]['lastTime'] = com\Lib\Fun\Time::getTime();
				return false;
			}
		}
		// 是否执行(暂时只支持秒级)
		if( com\Lib\Fun\Time::getTime() < $this->_goTimerAsTimeout[ $timerName ]['lastTime'] + ( $timeoutTimeMs / 1000 ) ){
			return false;
		}
		// 记录最后执行时间(必须在执行前记录，否者可能会出现死循环)
		$this->_goTimerAsTimeout[ $timerName ]['lastTime'] = com\Lib\Fun\Time::getTime();
		// 执行
		$fnRes = call_user_func( $fn );
		//
		return com\Lib\Com\Returns\CallFnRes::makeOfNew( $fnRes );
	}
	
}
